% NOIP2011-J T4 %input include "all_different.mzn"; int: n; array[1..n] of string: expr_str; %description array[1..4] of string: symbol_type=["+","*","(",")"]; array[1..n] of int: expr_int= [if expr_str[i]=="+" then 1 elseif expr_str[i]=="*" then 2 elseif expr_str[i]=="(" then 3 else 4 endif | i in 1..n]; int: symbol_count=count(i in 1..n)(expr_int[i]==1 \/ expr_int[i]==2); int: num_count=symbol_count + 1; int: max_plans=pow(2,num_count); array[1..max_plans,1..num_count] of var 0..1: number; var 0..max_plans: plan_num; constraint forall(i,j in 1..plan_num where i!=j)(not(forall(t in 1..num_count)(number[i,t]=number[j,t]))); array[1..symbol_count] of var 1..n: symbol_loc; constraint forall(i in 1..symbol_count)(expr_int[symbol_loc[i]]==1 \/ expr_int[symbol_loc[i]]==2); constraint forall(i in 1..symbol_count-1)(symbol_loc[i] bracket_num(symbol_loc[j]))(priority[i]